import javax.swing.*;  // Swing库，用于创建GUI组件
import java.awt.*;     // AWT库，用于布局管理
import java.io.*;      // IO库，用于文件读写操作
import java.util.LinkedList;  // 导入LinkedList类，用于存储书籍信息(ArrayList也可以)
import java.util.List;  // 导入List接口
import java.util.concurrent.ConcurrentMap;

// 主类 MainFrame 用于管理图书管理系统的主窗口
public class MainFrame {
    // 静态变量，用于存储书籍列表和主窗口
    private static List<Book> books;
    private static JFrame mainFrame;
    // 程序入口点
    public static void main(String[] args) {
        // 在控制台输出初始化信息
        System.out.println("正在初始化图书管理系统...");
        // 加载存储的书籍数据
        load();
        // 提示初始化成功
        System.out.println("图书管理系统初始化成功,欢迎使用");

        // 初始化主窗口
        mainFrame = new JFrame("图书管理系统");  // 创建一个新的JFrame窗口，标题为“图书管理系统”
        mainFrame.setSize(600, 400);  // 设置窗口大小为600x400像素
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // 设置窗口关闭时退出程序
        mainFrame.setLayout(new GridLayout(3, 2));  // 设置窗口布局为3行2列的网格布局

        // 创建6个操作按钮
        JButton addButton = new JButton("录入书籍信息");  // 添加书籍按钮
        JButton queryButton = new JButton("查询书籍信息");  // 查询书籍按钮
        JButton deleteButton = new JButton("删除书籍信息");  // 删除书籍按钮
        JButton modifyButton = new JButton("修改书籍信息");  // 修改书籍按钮
        JButton emptyButton = new JButton("清空书籍信息");  // 清空书籍按钮
        JButton exitButton = new JButton("退出系统");  // 退出系统按钮

        // 为每个按钮添加对应的事件监听器
        addButton.addActionListener(e -> insert());  // 点击后调用 insert() 方法，录入书籍
        queryButton.addActionListener(e -> list());  // 点击后调用 list() 方法，显示书籍列表
        deleteButton.addActionListener(e -> delete());  // 点击后调用 delete() 方法，删除书籍
        modifyButton.addActionListener(e -> modify());  // 点击后调用 modify() 方法，修改书籍
        emptyButton.addActionListener(e -> empty());  // 点击后调用 empty() 方法，清空书籍
        exitButton.addActionListener(e -> {  // 点击后保存书籍信息并退出系统
            System.out.println("正在保存图书数据...");
            save();  // 保存数据到文件
            System.out.println("图书数据保存成功,感谢你的使用,再见!");
            mainFrame.dispose();  // 关闭窗口
        });

        // 将按钮添加到主窗口中，按网格布局排列
        mainFrame.add(addButton);
        mainFrame.add(queryButton);
        mainFrame.add(deleteButton);
        mainFrame.add(modifyButton);
        mainFrame.add(emptyButton);
        mainFrame.add(exitButton);

        // 显示主窗口
        mainFrame.setVisible(true);
    }

    // 插入图书信息方法
    private static void insert() {
        // 创建三个文本输入框，分别用于输入书籍标题、作者和价格
        JTextField titleField = new JTextField(20);
        JTextField authorField = new JTextField(20);
        JTextField priceField = new JTextField(20);

        // 创建一个面板，并将标签和输入框以网格布局添加到面板中
        JPanel panel = new JPanel(new GridLayout(3, 2));
        panel.add(new JLabel("书籍标题:"));
        panel.add(titleField);
        panel.add(new JLabel("书籍作者:"));
        panel.add(authorField);
        panel.add(new JLabel("书籍价格:"));
        panel.add(priceField);

        // 弹出输入对话框，要求用户输入书籍信息
        int result = JOptionPane.showConfirmDialog(mainFrame, panel, "录入书籍信息", JOptionPane.OK_CANCEL_OPTION);
        if (result == JOptionPane.OK_OPTION) {
            // 从输入框获取用户输入的书籍信息
            String title = titleField.getText();
            String author = authorField.getText();
            int price = Integer.parseInt(priceField.getText());

            // 创建书籍对象并添加到书籍列表中
            Book book = new Book(title, author, price);
            books.add(book);
            // 显示添加成功的消息
            JOptionPane.showMessageDialog(mainFrame, "书籍信息添加成功:" + book);
        }
    }

    // 修改图书信息方法
    private static void modify() {
        // 弹出对话框，要求用户输入要修改的书籍ID编号
        String idStr = JOptionPane.showInputDialog(mainFrame, "请输入你要修改的书籍ID编号:");
        int id = Integer.parseInt(idStr);

        // 检查ID是否有效
        if (id >= books.size() || id < 0) {
            JOptionPane.showMessageDialog(mainFrame, "没有对应的书籍，请重新输入");
            return;
        }

        // 获取要修改的书籍对象
        Book book = books.get(id);

        // 创建输入框并预填充现有的书籍信息
        JTextField titleField = new JTextField(book.getTitle(), 20);
        JTextField authorField = new JTextField(book.getAuthor(), 20);
        JTextField priceField = new JTextField(String.valueOf(book.getPrice()), 20);

        // 创建一个面板，将标签和输入框以网格布局添加到面板中
        JPanel panel = new JPanel(new GridLayout(3, 2));
        panel.add(new JLabel("书籍标题:"));
        panel.add(titleField);
        panel.add(new JLabel("书籍作者:"));
        panel.add(authorField);
        panel.add(new JLabel("书籍价格:"));
        panel.add(priceField);

        // 弹出修改书籍信息的对话框
        int result = JOptionPane.showConfirmDialog(mainFrame, panel, "修改书籍信息", JOptionPane.OK_CANCEL_OPTION);
        if (result == JOptionPane.OK_OPTION) {
            // 获取修改后的书籍信息并更新书籍对象
            book.setTitle(titleField.getText());
            book.setAuthor(authorField.getText());
            book.setPrice(Integer.parseInt(priceField.getText()));
            // 显示修改成功的消息
            JOptionPane.showMessageDialog(mainFrame, "第" + id + "号书籍信息修改成功");
        }
    }

    // 显示书籍列表方法
    private static void list() {
        // 如果书籍列表为空，弹出提示框
        if (books.isEmpty()) {
            JOptionPane.showMessageDialog(mainFrame, "目前还没有存入书籍");
            return;
        }

        // 使用StringBuilder拼接书籍信息
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < books.size(); i++) {
            sb.append(i).append(". ").append(books.get(i)).append("\n");  // 每本书显示编号及信息
        }

        // 弹出书籍列表信息框
        JOptionPane.showMessageDialog(mainFrame, sb.toString(), "书籍列表", JOptionPane.INFORMATION_MESSAGE);
    }

    // 删除图书信息方法
    private static void delete() {
        // 弹出输入框，要求用户输入要删除的书籍ID编号
        String idStr = JOptionPane.showInputDialog(mainFrame, "请输入您要删除的书籍ID编号:");
        int id = Integer.parseInt(idStr);

        // 检查ID是否有效
        if (id >= books.size() || id < 0) {
            JOptionPane.showMessageDialog(mainFrame, "没有对应的书籍，请重新输入");
            return;
        }

        // 从列表中删除书籍并显示删除成功消息
        books.remove(id);
        JOptionPane.showMessageDialog(mainFrame, "删除第" + id + "号书籍信息成功！");
    }

    // 清空所有书籍信息方法
    private static void empty() {
        books.clear();  // 清空书籍列表
        JOptionPane.showMessageDialog(mainFrame, "所有书籍信息已清空");  // 显示清空成功消息
    }

    // 加载书籍信息方法，从文件读取保存的书籍列表
    private static void load() {
        File file = new File("data.txt");  // 定义文件路径
        if (file.exists()) {
            try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(file))) {
                books = (List<Book>) in.readObject();  // 从文件反序列化读取书籍列表
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        } else {
            books = new LinkedList<>();  // 如果文件不存在，创建新的空书籍列表
        }
    }

    // 保存书籍信息方法，将书籍列表保存到文件data.txt中
    private static void save() {
        try (ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream("data.txt"))) {
            stream.writeObject(books);// 将书籍列表序列化并写入文件
            stream.flush();//刷新操作,以防不能及时更新
        } catch (IOException e) {
            e.printStackTrace();// 如果保存过程中发生异常，输出错误信息
        }
    }
}